No C++, gerenciar o crescimento de contêineres é uma dança arquitetônica entre Tamanho (elementos atuais) e Capacidade (memória reservada). Para contêineres contíguos como vector e string, atingir a capacidade dispara um relocação: o sistema encontra um bloco de memória maior, move todos os elementos e destroi o bloco antigo. Essa é uma operação custosa de $O(n)$ que causa invalidação de iteradores—seus ponteiros para os elementos antigos tornam-se "pendentes" e perigosos.
1. Estratégia de Expansão
Para evitar alocações frequentes, vector as implementações alocam espaço de "buffer". O comando c.reserve(n) define explicitamente uma capacidade mínima sem adicionar elementos, enquanto c.shrink_to_fit() é um pedido não vinculante para devolver a memória excedente ao sistema operacional.
2. A Distinção entre Resize e Reserve
Enquanto reserve só afeta o buffer, resize(n) muda ativamente a lógica do contêiner. Reduzir via resize destrói elementos, enquanto expandir adiciona valores inicializados com padrão.
resize reduzir o contêiner invalida os iteradores dos elementos excluídos. Se a expansão causar relocação, TODOS todos os iteradores são invalidados.